Import modules¶

In [1]:
from pathlib import Path

from ipyniivue import download_dataset

DATA_FOLDER = Path("images")

# Meshes
download_dataset(
    "https://niivue.com/demos/images/",
    dest_folder=DATA_FOLDER,
    files=[
        "BrainMesh_ICBM152.lh.mz3",
        "BrainMesh_ICBM152.lh.motor.mz3",
    ],
)

# Matcaps
download_dataset(
    api_url="https://niivue.com/demos/matcaps",
    dest_folder=DATA_FOLDER / "matcaps",
    files=[
        "Shiny.jpg",
        "Cortex.jpg",
        "Cream.jpg",
        "Fuzzy.jpg",
        "Peach.jpg",
        "Plastic.jpg",
        "Gold.jpg",
    ],
)
BrainMesh_ICBM152.lh.mz3 already exists.
BrainMesh_ICBM152.lh.motor.mz3 already exists.
Dataset downloaded successfully to images.
Shiny.jpg already exists.
Cortex.jpg already exists.
Cream.jpg already exists.
Fuzzy.jpg already exists.
Peach.jpg already exists.
Plastic.jpg already exists.
Gold.jpg already exists.
Dataset downloaded successfully to images/matcaps.
In [2]:
import ipywidgets as widgets

from ipyniivue import NiiVue, SliceType

# Create niivue instance

nv = NiiVue(
    show_3d_crosshair=True,
    back_color=(1, 1, 1, 1),
)

nv.set_slice_type(SliceType.RENDER)
nv.opts.is_colorbar = True

# Load meshes and mesh layers

mesh_layer = {
    "path": DATA_FOLDER / "BrainMesh_ICBM152.lh.motor.mz3",
    "cal_min": 2,
    "cal_max": 5,
    "use_negative_cmap": True,
    "opacity": 0.7,
}

nv.load_meshes(
    [
        {
            "path": DATA_FOLDER / "BrainMesh_ICBM152.lh.mz3",
            "layers": [mesh_layer],
        },
    ]
)

nv.set_mesh_shader(nv.meshes[0].id, "Matcap")
nv.set_clip_plane(-0.1, 270, 0)

# Add extra widgets and setup observers

threshold_slider = widgets.IntSlider(
    value=20,
    min=1,
    max=49,
    description="Threshold",
)

matcap_options = ["Shiny", "Cortex", "Cream", "Fuzzy", "Peach", "Plastic", "Gold"]
matcap_dropdown = widgets.Dropdown(
    options=matcap_options,
    value="Shiny",
    description="MatCap",
)


def on_threshold_change(change):
    """Set mesh layer property cal_min."""
    nv.set_mesh_layer_property(
        mesh_id=nv.meshes[0].id,
        layer_index=0,
        attribute="cal_min",
        value=change["new"] * 0.1,
    )


threshold_slider.observe(on_threshold_change, names="value")


def on_matcap_change(change):
    """Load matcap texture."""
    nv.set_mesh_shader(nv.meshes[0].id, "Matcap")
    matcap_name = change["new"]
    matcap_path = DATA_FOLDER / "matcaps" / f"{matcap_name}.jpg"
    with open(matcap_path, "rb") as f:
        matcap_data = f.read()
    nv.load_mat_cap_texture(matcap_data)


matcap_dropdown.observe(on_matcap_change, names="value")

# Display all

widgets.VBox(
    [
        widgets.HBox([threshold_slider, matcap_dropdown]),
        nv,
    ]
)
Out[2]: